'''
Description: 
Author: Zilu
Date: 2021-11-18 12:46:17
Version: 
LastEditTime: 2021-11-18 13:06:11
LastEditors: Zilu
'''

# 异步 IO：
# 当遇到IO操作时，代码只负责发出IO请求，不等待IO结果，
# 然后直接结束本轮消息处理，进入下一轮消息处理过程。
# 当IO操作完成后，将收到一条“IO完成”的消息，处理该消息时就可以直接获取IO操作结果。

# 协程看上去也是子程序，但执行过程中，在子程序内部可中断，
# 然后转而执行别的子程序，在适当的时候再返回来接着执行。

# python 中的yield不但可以返回一个值，也可以用来接收调用者发出的参数
# 生产者-消费者模型
from typing import Generator

def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
            return
        print('[CONSUMER] Consuming %s ...' % n)
        r = '200 OK'

def produce(c:Generator):
    # send(value) 方法向生成器发送一个值value，value成为当前yield表达式的结果，方法返回生成器产生的下一个值
    c.send(None)
    n = 0
    while n < 5:
        n += 1
        print('[PRODUCER] Producing %s ...' % n)
        r = c.send(n)
        print('[PRODUCER] Consumer return %s ...' % r)
    c.close()

c = consumer()
produce(c)

# 套用Donald Knuth的一句话总结协程的特点：“子程序就是协程的一种特例。”




